package zgrjb.snbq.teach_platform.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import zgrjb.snbq.teach_platform.service.NotificationService;
import zgrjb.snbq.teach_platform.service.TaskQueueService;

/**
 * 自定义任务调度器
 * 负责定时执行各种后台任务
 * 
 * @author system
 * @since 2024-12-28
 */
@Component("customTaskScheduler")
@Slf4j
public class CustomTaskScheduler {

    @Autowired
    private TaskQueueService taskQueueService;

    @Autowired
    private NotificationService notificationService;

    /**
     * 每天凌晨1点执行任务清理和生成
     */
    @Scheduled(cron = "0 0 1 * * ?")
    public void dailyTaskMaintenance() {
        log.info("开始执行每日任务维护");
        
        try {
            // 1. 清理过期任务
            cleanExpiredTasks();
            
            // 2. 生成提醒任务
            generateReminderTasks();
            
            // 3. 统计今日任务完成情况
            generateDailyReport();
            
            log.info("每日任务维护完成");
        } catch (Exception e) {
            log.error("每日任务维护失败", e);
        }
    }

    /**
     * 每小时检查即将到期的任务
     */
    @Scheduled(cron = "0 0 * * * ?")
    public void hourlyTaskCheck() {
        log.info("开始执行每小时任务检查");
        
        try {
            // 检查即将到期的任务并发送提醒
            checkUpcomingTasks();
            
        } catch (Exception e) {
            log.error("每小时任务检查失败", e);
        }
    }

    /**
     * 每10分钟检查系统状态
     */
    @Scheduled(fixedRate = 600000) // 10分钟 = 600000毫秒
    public void systemStatusCheck() {
        log.debug("开始执行系统状态检查");
        
        try {
            // 检查WebSocket连接数
            int messageConnections = MessageWebSocketHandler.getOnlineUserCount();
            int notificationConnections = NotificationWebSocketHandler.getOnlineUserCount();
            
            log.debug("当前WebSocket连接数 - 消息: {}, 通知: {}", messageConnections, notificationConnections);
            
            // 如果需要，可以在这里添加更多的系统监控逻辑
            
        } catch (Exception e) {
            log.error("系统状态检查失败", e);
        }
    }

    /**
     * 每周日晚上11点生成周报
     */
    @Scheduled(cron = "0 0 23 * * SUN")
    public void weeklyReport() {
        log.info("开始生成周报");
        
        try {
            generateWeeklyReport();
            
        } catch (Exception e) {
            log.error("生成周报失败", e);
        }
    }

    /**
     * 清理过期任务
     */
    private void cleanExpiredTasks() {
        try {
            taskQueueService.cleanExpiredTasks();
            log.info("过期任务清理完成");
        } catch (Exception e) {
            log.error("清理过期任务失败", e);
        }
    }

    /**
     * 生成提醒任务
     */
    private void generateReminderTasks() {
        try {
            // 这里可以根据业务需求自动生成各种提醒任务
            // 例如：考试前3天提醒、作业截止前1天提醒等
            
            log.info("提醒任务生成完成");
        } catch (Exception e) {
            log.error("生成提醒任务失败", e);
        }
    }

    /**
     * 检查即将到期的任务
     */
    private void checkUpcomingTasks() {
        try {
            // 这里可以查询即将到期的任务，并发送提醒通知
            
            log.debug("即将到期任务检查完成");
        } catch (Exception e) {
            log.error("检查即将到期任务失败", e);
        }
    }

    /**
     * 生成日报
     */
    private void generateDailyReport() {
        try {
            // 生成今日任务完成情况报告
            
            log.info("日报生成完成");
        } catch (Exception e) {
            log.error("生成日报失败", e);
        }
    }

    /**
     * 生成周报
     */
    private void generateWeeklyReport() {
        try {
            // 生成本周任务完成情况报告
            
            log.info("周报生成完成");
        } catch (Exception e) {
            log.error("生成周报失败", e);
        }
    }
} 